package com.gt.quality.system.service.excel;

import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.gt.quality.system.entity.SysFileInfo;
import com.gt.quality.system.service.SysFileInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.concurrent.Executor;

/**
 * @author Administrator
 */
@Component
@Slf4j
public class SysExcelExportFileService extends ExcelHandler {

    @Value("${sys.conf.file.path}")
    private String filePath;

    public static final  String XLSX = ".xlsx";

    private SysFileInfoService sysFileInfoService;

    @Autowired
    public void setSysFileInfoService(SysFileInfoService sysFileInfoService) {
        this.sysFileInfoService = sysFileInfoService;
    }

    /**
     * 传入参数例如： writeBeanTest.xlsx
     * 传入映射字段和Excel标题别名 aliasAndSort 注意提前排序好 例如-> ("name", "姓名");
     *
     * @param excelName excelName
     */
    public SysFileInfo exportExcelToFileSystem(String excelName, SortedMap<String, String> aliasAndSort, List<Object> rows) {
        LocalDateTime now = LocalDateTime.now();
        int year = now.getYear();
        int month = now.getMonth().getValue();
        int dayOfMonth = now.getDayOfMonth();
        StringBuilder realFileSavePath = new StringBuilder();
        realFileSavePath.append(filePath).
                append(File.separator).
                append(year).
                append(File.separator).
                append(month).
                append(File.separator).
                append(dayOfMonth).append(File.separator);
        if (StringUtils.isBlank(excelName)) {
            excelName = IdUtil.fastSimpleUUID();
        }
        realFileSavePath.append(excelName);
        if (!excelName.endsWith(XLSX)) {
            realFileSavePath.append(XLSX);
        }
        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(realFileSavePath.toString());

        // 自定义标题别名 需要提前排序号
        for (Map.Entry<String, String> item : aliasAndSort.entrySet()) {
            writer.addHeaderAlias(item.getKey(), item.getValue());
        }

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);

        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);
        // 关闭writer，释放内存
        writer.close();
        SysFileInfo sysFileInfo = new SysFileInfo().
                setFilePath(realFileSavePath.toString()).
                setRemark(excelName).
                setFileType(XLSX);
        boolean save = sysFileInfoService.save(sysFileInfo);
        log.info("数据导入Excel结果:{},Excel名称{}", save, excelName);
        return sysFileInfo;
    }

    /**
     * 大文件批处理导出--每次线程查询的记录数量
     * @param currentIndex    当前页
     * @param defaultPageSize 每页查询条数
     * @return List
     */
    @Override
    public List<Object> callBackSelectPageData(int currentIndex, int defaultPageSize) {
        return new ArrayList<>();
    }


    /**
     * 表对应的实体对象Class
     * @return Class
     */
    @Override
    public Class<?> getEntityClass() {
        return Object.class;
    }

    /**
     * 大文件导出使用的线程池
     * @return Executor
     */
    @Override
    public Executor getThreadPoolTaskExecutor() {
        // 强烈建议-----可以使用自己的 taskExecutor||否则默认
        return null;
    }

}
